<?php
App::uses('AppController', 'Controller');
/**
 * Devis Controller
 *
 * @property Devi $Devi
 */
class DevisController extends AppController {
	
	var $helpers = array('pdf'); // this will use the pdf.php class 

	public function enregistrerDevis() {
		$this->Session->delete('question_devis');
		if(isset($this->data['formatPDF'])) {
			$text = "";
			foreach($this->data['question_devis'] as $id => $question_devis) {
				$text .= $question_devis['libelle'] . " " . $question_devis['val'] . "\n";
			}
			$this->Session->write("questions_devis", $text);
			$this->redirect(array("action" => 'formatPdf'));
		}
		// si le commercial a cliqué sur 'Devis accepté', on change le statut_perso du devis
		else if(isset($this->data['accept'])) {
			$this->Devi->read(null, $id_devis);
			$this->Devi->set('statut_perso', 'accepté');
			$this->Devi->save();
			$this->Session->setFlash(__('Les modifications ont été enregistrées.'), 'flash_success');
			$this->redirect(array('controller' => 'devis', "action" => 'devisArchives'));
		}
		// si le commercial a cliqué sur 'Devis refusé', on change le statut_perso du devis
		else if(isset($this->data['refuse'])) {
			$this->Devi->read(null, $id_devis);
			$this->Devi->set('statut_perso', 'refusé');
			$this->Devi->save();
			$this->Session->setFlash(__('Les modifications ont été enregistrées.'), 'flash_success');
			$this->redirect(array('controller' => 'devis', "action" => 'devisArchives'));
		}
		else {
			$this->set('data', $this->data);
			$this->set('user', $this->Session->read('utilisateur'));
			
			$id_devis = $this->Session->read("utilisateur.id_devis");
			
			// chargement du model
			$this->loadModel('LigneDevi');
			$this->loadModel('ReponsesDonnee');
			$this->loadModel('Devi');
			$this->loadModel('BlocDevi');
			
			$this->Devi->modifierLaRef(date('myd').'-'.date('Hi'), $id_devis);
			//$this->Devi->modifierLaRemise($this->data['remise'], $id_devis);
			
			$infos = $this->Devi->infosSocieteDevis($id_devis);
			$id_questionnaire = $infos['questionnaire']['id_questionnaire'];
			
			// on enregistre les quetions de type devis dans des variables de session pour la génération du PDF
			if(isset($this->data['question_devis'])) {
				foreach($this->data['question_devis'] as $id => $question_devis) {
					$reponseDejaDonnee = $this->ReponsesDonnee->reponseDonnees($id_questionnaire, $id);
					switch($question_devis['type']) {
						case 'ARTICLE' :
							// parcours des différents articles pour la même question
							foreach($question['qte'] as $k => $v) {
								$this->ReponsesDonnee->create();
								$this->ReponsesDonnee->save(array('id_questionnaire' => $id_questionnaire,
															'id_question' => $id,
															'reponse_quantite_article' => $v,
															'id_article' => $question_devis['art'][$k]
														));
							}
						break;
						case 'ENTIER' :
							$this->ReponsesDonnee->create();
							$this->ReponsesDonnee->save(array('id_questionnaire' => $id_questionnaire,
															'id_question' => $id,
															'reponse_entier' => $question_devis['val']
														));
						break;
						case 'LISTE' :
							// si la réponse a déjà été donnée avant, alors la ligne existe dans la table reponses_donnees, il faut donc mettre à jour cette ligne
							if(isset($reponseDejaDonnee) && !empty($reponseDejaDonnee)) {
								$conditions = array("ReponsesDonnee.id_question" => $id, 'ReponsesDonnee.id_questionnaire' => $id_questionnaire);
								$this->ReponsesDonnee->updateAll(
									array('ReponsesDonnee.id_reponse' => ((isset($question_devis['val']) && !empty($question_devis['val'])) ? $question_devis['val'] : 'NULL')),
									$conditions
								);
							}
							// sinon on crée la ligne
							else {
								$this->ReponsesDonnee->create();
								$this->ReponsesDonnee->save(array('id_questionnaire' => $id_questionnaire,
															'id_question' => $id,
															'id_reponse' => $question_devis['val']
														));
							}
						break;
						case 'OUINON' :
							$this->ReponsesDonnee->create();
							$this->ReponsesDonnee->save(array('id_questionnaire' => $id_questionnaire,
															'id_question' => $id,
															'reponse_donnee_oui_non' => ($question_devis['val'] == 'OUI')
														));
						break;
						case 'TEXTE' :
							$this->ReponsesDonnee->create();
							$this->ReponsesDonnee->save(array('id_questionnaire' => $id_questionnaire,
															'id_question' => $id,
															'reponse_donnee_texte' => $question_devis['val']
														));
						break;
						default :
						break;
					}
				}
			}
			
			// on vide le devis de ses valeurs actuelles
			$this->Devi->vider($id_devis);
			// ajout des articles
			if(isset($this->data['article'])) {
				foreach ($this->data['article'] as $id => $article) {
					$infosBloc = $this->BlocDevi->find('first', array('conditions' => array('id_bloc_devis' => $article['bloc'])));
					$this->LigneDevi->ajouterLigne($id_devis,
					array('id' => $article['bloc'], 'libelle' => $this->data['bloc'][$article['bloc']]['nom'], 'rang' => $this->data['bloc'][$article['bloc']]['rang'], 'acompte' => $infosBloc['BlocDevi']['acompte']),
					array('id' => $article['groupe'], 'libelle' => $this->data['categorie'][$article['groupe']]['nom'], 'rang' => $this->data['categorie'][$article['groupe']]['rang']),
					array('id' => $id, 'description' => $article['description'], 'ref' => $article['code'], 'quantite' => $article['quantite'], 'prix' => $article['prix']));
				}
			}
			
			// si on a cliqué sur 'accepter et valider le devis' il faut changer son statut
			if(isset($this->data['validation'])) {
				$this->Devi->read(null, $id_devis);
				$this->Devi->set(array('statut_devis' => 'validé', 'statut_perso' => 'en cours'));
				$this->Devi->save();
			}
			
			$this->Session->setFlash(__('Les modifications ont été enregistrées.'), 'flash_success');
			// redirection vers la liste des devis suivant le statut de l'utilisateur
			if($this->Session->read('utilisateur.estAdmin')) {
				$this->redirect(array('controller' => 'admin/devis'));
			}
			else {
				$this->redirect(array('controller' => 'devis', "action" => 'devisEnCours'));
			}
		}
	}
	
	public function formatPdf() {
		if(isset($this->params['named']['id_devis']) && !empty($this->params['named']['id_devis'])) {
			$this->Session->write('utilisateur.id_devis', $this->params['named']['id_devis']);
			$this->redirect(array("action" => 'formatPdf'));
		}
		$nodevis = $this->Session->read('utilisateur.id_devis');
		$devis = $this->Devi->find('first', array('conditions' => array( 'id_devis' => $nodevis ) ));
		$this->set('statut', $devis['Devi']['statut_devis']);
		
		if($devis['Devi']['statut_devis'] == "validé") {
			App::import('Vendor', 'Fpdf', array('file' => 'fpdf/fpdf.php'));
			$this->layout = 'pdf'; //this will use the pdf.thtml layout 
			
			$this->response->type('pdf');
			
			$this->loadModel('Utilisateur');
			$this->loadModel('Societe');
			$this->loadModel('LigneDevi');
			
			$commercial = $this->Utilisateur->read(null, $this->Session->read('utilisateur.id'));
			
			$societe = $this->Societe->find('first' , array('conditions' => array('id_societe' => $devis['Devi']['id_societe'])));
			
			
			/* définition des données */
			$this->set('date',			strftime("%d %b %Y", strtotime($devis['Devi']['date_creation'])));
			$this->set('nom_contact',	$commercial['Utilisateur']['nom_utilisateur']);
			$this->set('mail_contact',	$commercial['Utilisateur']['mail']);
			$this->set('tel_contact',	$commercial['Utilisateur']['telephone']);
			$this->set('fax_contact',	$commercial['Utilisateur']['fax']);
			
			$this->set('nom_societe',		$societe['societe']['raison_sociale']);
			$this->set('contact_societe',	$societe['societe']['contact_administratif']);
			$this->set('adresse_societe',	$societe['societe']['adresse_facturation']);
			$this->set('CP_societe',		$societe['societe']['code_postal_societe']);
			$this->set('ville_societe',		$societe['societe']['ville_societe']);
			$this->set('tel_societe',		$societe['societe']['telephone_administratif']);
			$this->set('mail_societe',		$societe['societe']['mail_administratif']);
			
			$this->set('ref_devis', $devis['Devi']['ref_devis']);
			//$this->set('remise_devis', $devis['Devi']['remise_devis']);
			$this->set('statut', $devis['Devi']['statut_devis']);
			
			$this->set('lignes', $this->LigneDevi->lignesDuDevis($nodevis));
			//$this->set('lignes', $);
			
			$this->render();
		}
	}

	// fonction pour la finalisation du devis
	public function finalisation() {
		
		// chargement des modèles nécessaire
		$this->loadModel('Utilisateur');
		$this->loadModel('Societe');
		$this->loadModel('LigneDevi');
		$this->loadModel('ArticlesCategory');
		$this->loadModel('Questionnaire');
		$this->loadModel('ArticlesEnCascade');
		$this->loadModel('Question');
		$this->loadModel('Tarif');
		
		// liste des questions qui seront affichees dansla page 'finalisation' (exemple : durée d'engagement)
		$this->set('questions_finalisation', $this->Question->questionsEtReponsesFinalisation());
		
		// si cette fonction est appelée après avoir cliquer sur 'Dupliquer', on va chercher les articles directement dans ligne_devis (qui ont déja été dupliquer)
		$duplication = $this->Session->read('utilisateur.duplication');
		if(isset($duplication) && !empty($duplication) && $duplication == true) {
			$this->set('articles_reponses', $this->LigneDevi->lignesDuDevis($this->Session->read('utilisateur.id_devis')));
			$this->set('duplication', $duplication);
			$this->set('reponses_finalisation', $this->Question->reponsesDonneesFinalisation($this->Session->read('utilisateur.id_questionnaire')));
			$this->Session->delete('utilisateur.duplication');
		}
		else {
			// sinon, on récupère les réponses données dans le questionnaire pour afficher le devis à finaliser
			// et on récupère les articles présents dans les réponses données
			$this->set('articles_reponses',
				array_merge($this->Devi->recupArticlesDepuisReponses($this->Session->read('utilisateur.id_questionnaire')),
							$this->Questionnaire->obtenirLesArticles($this->Session->read('utilisateur.id_questionnaire'))));
		}
		// on récupère les informations de l'utilisateur actuellement connécté
		$this->set('commercial', $this->Utilisateur->read(null, $this->Session->read('utilisateur.id')));
		// on récupère les informations de la société ajouté dernièrement
		$this->set('societe', $this->Societe->read(null, $this->Session->read('utilisateur.id_societe')));
		
		// on définit l'ensemble des categorie d'article
		$this->set('categories', $this->ArticlesCategory->toutesLesCategoriesEtLeursArticles());
		// on récupères les règles de types ligne_ligne
		$this->set('regle_ligne_ligne', $this->ArticlesEnCascade->recupererRegles());
		// on récupères les règles de type devis
		$this->set('regle_devis', $this->Tarif->regleDevis($this->Session->read('utilisateur.id_questionnaire')));
		
		$this->set('id_questionnaire', $this->Session->read('utilisateur.id_questionnaire'));
		
	}
	
	public function edit() {
		$this->loadModel('LigneDevi');
		$this->loadModel('ArticlesCategory');
		$this->loadModel('ArticlesEnCascade');
		$this->loadModel('Question');
		$this->loadModel('Tarif');
		$this->loadModel('Devi');
		
		$this->set('infos', $this->Devi->infosSocieteDevis($this->params['named']['id_devis']));
		$this->set('lignes_devis', $this->LigneDevi->lignesDuDevis($this->params['named']['id_devis']));
		$this->set('articles_reponses', $this->LigneDevi->lignesDuDevis($this->params['named']['id_devis']));
		// on définit l'ensemble des categorie d'article
		$this->set('categories', $this->ArticlesCategory->toutesLesCategoriesEtLeursArticles());
		// on récupères les règles de types ligne_ligne
		$this->set('regle_ligne_ligne', $this->ArticlesEnCascade->recupererRegles());
		// on récupères les règles de type devis
		$infos = $this->Devi->infosSocieteDevis($this->params['named']['id_devis']);
		$id_questionnaire = $infos['questionnaire']['id_questionnaire'];
		$this->set('regle_devis', $this->Tarif->regleDevis($id_questionnaire));
		$this->set('questions_finalisation', $this->Question->questionsEtReponsesFinalisation());
		$this->set('reponses_finalisation', $this->Question->reponsesDonneesFinalisation($id_questionnaire));
		$this->Session->write("utilisateur.id_devis", $this->params['named']['id_devis']);
	}
	
	public function devisEnCours() {
		$this->paginate = array(
			'Devi' => array(
				'recursive' => -1,
				'fields' => array(
					'societe.raison_sociale', 'Devi.date_creation', 'Devi.ref_devis', 'Devi.statut_perso', 'Devi.id_devis'
				),
				'conditions' => array('statut_perso=\'en attente\' OR statut_perso=\'en cours\'', 'Devi.id_utilisateur='.$this->Session->read('utilisateur.id')),
				'order' => array(),
				'joins' => array(
					array('type' => 'LEFT', 'alias' => 'societe', 'table' => 'societes',
							'conditions' => 'Devi.id_societe = societe.id_societe'),
					array('type' => 'LEFT', 'alias' => 'utilisateur', 'table' => 'utilisateurs',
							'conditions' => 'utilisateur.id_utilisateur = Devi.id_utilisateur'),
				)
			)
		);
		$this->set('devisEnCours', $this->paginate());
	}
	
	public function devisArchives() {
		$this->paginate = array(
			'Devi' => array(
				'recursive' => -1,
				'fields' => array(
					'societe.raison_sociale', 'Devi.id_devis', 'Devi.date_creation', 'Devi.ref_devis', 'Devi.statut_perso'
				),
				'conditions' => array('statut_perso=\'accepté\' OR statut_perso=\'refusé\'', 'Devi.id_utilisateur='.$this->Session->read('utilisateur.id')),
				'order' => array(),
				'joins' => array(
					array('type' => 'LEFT', 'alias' => 'societe', 'table' => 'societes',
							'conditions' => 'Devi.id_societe = societe.id_societe'),
					array('type' => 'LEFT', 'alias' => 'utilisateur', 'table' => 'utilisateurs',
							'conditions' => 'utilisateur.id_utilisateur = Devi.id_utilisateur'),
				)
			)
		);
		$this->set('anciensDevis', $this->paginate());
	}
	
	public function dupliquer() {
		$this->loadModel('Societe');
		$this->loadModel('Questionnaire');
		$this->loadModel('Site');
		$this->loadModel('ReponsesDonnee');
		$this->loadModel('LigneDevi');
		
		$infos = $this->Devi->infos_pour_dupliquer($this->params['named']['id_devis']);
		$id_old_societe = $infos['societe']['id_societe'];
		$id_old_devis = $infos['devis']['id_devis'];
		
		// duplication de la société
		$this->Societe->create();
		$this->Societe->save(array(
			'raison_sociale' => $infos['societe']['raison_sociale'],
			'contact_administratif' => $infos['societe']['contact_administratif'],
			'adresse_facturation' => $infos['societe']['adresse_facturation'],
			'code_postal_societe' => $infos['societe']['code_postal_societe'],
			'ville_societe' => $infos['societe']['ville_societe'],
			'telephone_administratif' => $infos['societe']['telephone_administratif'],
			'mail_administratif' => $infos['societe']['mail_administratif'],
			'fax_administratif' => $infos['societe']['fax_administratif'],
			'contact_technique' => $infos['societe']['contact_technique'],
			'telephone_technique' => $infos['societe']['telephone_technique'],
			'mail_technique' => $infos['societe']['mail_technique']
		));
		
		$id_nouvelle_societe = $this->Societe->getInsertId();
		$this->Session->write('utilisateur.id_societe', $id_nouvelle_societe);
		
		// duplication du questionnaire
		$this->Questionnaire->create();
		$this->Questionnaire->set('id_utilisateur', $this->Session->read('utilisateur.id'));
		$this->Questionnaire->set('id_societe', $id_nouvelle_societe);
		$this->Questionnaire->save();
		$id_questionnaire = $this->Questionnaire->getInsertId();
		$this->Session->write('utilisateur.id_questionnaire', $id_questionnaire);
		
		// duplication du devis
		$nb_ref = $this->Devi->find('count');
		if($nb_ref == 10000) {
			$nb_ref = 0;
		}
		$this->Devi->create();
		$this->Devi->save(array('id_utilisateur' => $this->Session->read('utilisateur.id'),
								'id_societe' => $this->Session->read('utilisateur.id_societe'),
								'date_creation' => date("Y-m-d H:m:s"),
								'statut_devis' => 'en attente',
								'statut_perso' => 'en attente',
								'ref_devis' => date('dmy').'-'.str_pad(strval($nb_ref+1), 4, "0", STR_PAD_LEFT)
							));
		$this->Session->write('utilisateur.id_devis', $this->Devi->getInsertID());
		
		// duplication des sites
		foreach($infos['sites'] as $site) {
			$this->Site->create();
			$this->Site->save(array('id_societe' => $id_nouvelle_societe));
			$id_site = $this->Site->getInsertID();
			$reponses_site = $this->ReponsesDonnee->reponsesDonneesDuSite($site['id_site']);
			// duplication des reponses donnees par site
			foreach($reponses_site as $r) {
				$this->ReponsesDonnee->insertAvecReponses($id_questionnaire, $id_site, $r['reponses_donnees']);
			}
		}
		
		// duplication des reponses donnees qui n'ont pas de site (c'est le cas de la durée d'engagement)
		$reponses = $this->ReponsesDonnee->reponsesDonneesQuestionnaire($infos['questionnaire']['id_questionnaire']);
		foreach($reponses as $r) {
			$this->ReponsesDonnee->insertAvecReponses($id_questionnaire, 'NULL', $r['reponses_donnees']);
		}
		
		// duplication des lignes apparaissant dans le devis
		$lignes = $this->LigneDevi->lignesDuDevis($id_old_devis);
		foreach($lignes as $ligne) {
			$bloc = array();
			$bloc['id'] = $ligne['ligne_devis']['id_bloc_devis'];
			$bloc['libelle'] = $ligne['ligne_devis']['libelle_bloc_devis'];
			$bloc['rang'] = $ligne['ligne_devis']['rang_bloc_devis'];
			$bloc['acompte'] = $ligne['ligne_devis']['acompte'];
			
			$groupe = array();
			$groupe['id'] = $ligne['ligne_devis']['id_groupe_devis'];
			$groupe['libelle'] = $ligne['ligne_devis']['libelle_groupe_devis'];
			$groupe['rang'] = $ligne['ligne_devis']['rang_groupe_devis'];
			
			$article = array();
			$article['id'] = $ligne['ligne_devis']['id_article'];
			$article['ref'] = $ligne['ligne_devis']['ref_article'];
			$article['description'] = $ligne['ligne_devis']['description_article'];
			$article['quantite'] = $ligne['ligne_devis']['quantite_article'];
			$article['prix'] = $ligne['ligne_devis']['tarif_brut'];
			
			$this->LigneDevi->ajouterLigne($this->Session->read('utilisateur.id_devis'), $bloc, $groupe, $article);
		}
		
		$this->Session->write('utilisateur.duplication', true);
		
		$this->redirect(array('action' => 'finalisation'));
	}
	
/**
 * admin_index method
 *
 * @return void
 */
	public function admin_index() {
		$this->paginate = array(
			'Devi' => array(
				'recursive' => -1,
				'fields' => array(
					'Utilisateur.nom_utilisateur',
					'Societe.raison_sociale',
					'Devi.id_devis', 'Devi.date_creation', 'Devi.ref_devis', 'Devi.statut_devis'
				),
				'conditions' => array('statut_devis=\'en attente\''),
				'order' => array(),
				'joins' => array(
					array('type' => 'LEFT', 'alias' => 'societe', 'table' => 'societes',
							'conditions' => 'Devi.id_societe = societe.id_societe'),
					array('type' => 'LEFT', 'alias' => 'utilisateur', 'table' => 'utilisateurs',
							'conditions' => 'utilisateur.id_utilisateur = Devi.id_utilisateur')
				)
			)
		);
		$this->set('devis', $this->paginate());
	}


/**
 * admin_add method
 *
 * @return void
 */
	public function admin_add() {
		if ($this->request->is('post')) {
			$this->Devi->create();
			if ($this->Devi->save($this->request->data)) {
				$this->Session->setFlash(__('Le devis a été enregistré.', 'flash_success'));
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('Le devis n\'a pas pu être enregistré. Merci de réessayer'));
			}
		}
	}

/**
 * admin_edit method
 *
 * @param string $id
 * @return void
 */
	public function admin_edit($id = null) {
		$this->Devi->id = $id;
		if (!$this->Devi->exists()) {
			throw new NotFoundException(__('Invalid devi'));
		}
		if ($this->request->is('post') || $this->request->is('put')) {
			if ($this->Devi->save($this->request->data)) {
				$this->Session->setFlash(__('Le devis a été enregistré.', 'flash_success'));
				$this->redirect(array('action' => 'index'));
			} else {
				$this->Session->setFlash(__('Le devis n\'a pas pu être enregistré. Merci de réessayer'));
			}
		} else {
			$this->request->data = $this->Devi->read(null, $id);
		}
	}

/**
 * admin_delete method
 *
 * @param string $id
 * @return void
 */
	public function admin_delete($id = null) {
		if (!$this->request->is('post')) {
			throw new MethodNotAllowedException();
		}
		$this->Devi->id = $id;
		if (!$this->Devi->exists()) {
			throw new NotFoundException(__('Devis invalide'));
		}
		if ($this->Devi->delete()) {
			$this->Session->setFlash(__('Devis supprimé', 'flash_success'));
			$this->redirect(array('action' => 'index'));
		}
		$this->Session->setFlash(__('Le devis n\'a pas été supprimé.'));
		$this->redirect(array('action' => 'index'));
	}
		
		
	/**
	 * index method
	 * 
	 * @return void
	 */
	public function index() {
		$this->paginate = array(
			'Devi' => array(
				'recursive' => -1,
				'fields' => array(
					'Utilisateur.nom_utilisateur',
					'Societe.raison_sociale',
					'Devi.id_devis', 'Devi.date_creation', 'Devi.ref_devis', 'Devi.statut_devis'
				),
				'conditions' => array('statut_devis=\'en attente\''),
				'order' => array(),
				'joins' => array(
					array('type' => 'LEFT', 'alias' => 'societe', 'table' => 'societes',
							'conditions' => 'Devi.id_societe = societe.id_societe'),
					array('type' => 'LEFT', 'alias' => 'utilisateur', 'table' => 'utilisateurs',
							'conditions' => 'utilisateur.id_utilisateur = Devi.id_utilisateur')
				)
			)
		);
		$this->set('devis', $this->paginate());
	}
}
